package ioc

import (
	"fmt"
	"os"
	"regexp"

	"gitee.com/hexug/go-tools/logger"
	"github.com/BurntSushi/toml"
	"github.com/caarlos0/env/v11"
	"gopkg.in/yaml.v3"
)

// LoadConfigFromToml 从文件加载配置
func (i *IocContainter) LoadConfigFromToml(path string) {
	if i.ForceLoad {
		logger.L().Warn("警告：配置已加载过了，不可重复加载！")
		return
	}
	var config map[string]any
	// 从文件中解析
	_, err := toml.DecodeFile(path, &config)
	// 看下是否报错，或者报错是否为文件无法找到
	if err != nil {
		re := regexp.MustCompile("The system cannot find the file|path specified")
		if ok := re.MatchString(err.Error()); ok {
			panic(fmt.Errorf("%s 文件不存在\n%s", path, err))
		}
		panic(err)
	}

	for key, value := range config {
		if conf, ok := i.confObjs[key]; ok {
			// 将 value 转换为对应的结构体
			bytes, err := toml.Marshal(value)
			if err != nil {
				panic(err)
			}
			err = toml.Unmarshal(bytes, conf)
			if err != nil {
				panic(err)
			}
		}
	}
}

// LoadConfigFromYaml 从文件加载配置
func (i *IocContainter) LoadConfigFromYaml(path string) {
	if i.ForceLoad {
		logger.L().Warn("警告：配置已加载过了，不可重复加载！")
		return
	}
	var config map[string]any
	// 从文件中解析
	file, err := os.Open(path)
	// 看下是否报错，或者报错是否为文件无法找到
	if err != nil {
		re := regexp.MustCompile("The system cannot find the file|path specified")
		if ok := re.MatchString(err.Error()); ok {
			panic(fmt.Errorf("%s 文件不存在\n%s", path, err))
		}
		panic(err)
	}
	de := yaml.NewDecoder(file)
	err = de.Decode(&config)
	if err != nil {
		panic(err)
	}
	for key, value := range config {
		if conf, ok := i.confObjs[key]; ok {
			// 将 value 转换为对应的结构体
			bytes, err := yaml.Marshal(value)
			if err != nil {
				panic(err)
			}
			err = yaml.Unmarshal(bytes, conf)
			if err != nil {
				panic(err)
			}
		}
	}
}

// LoadConfigFromEnv 从环境变量加载配置
func (i *IocContainter) LoadConfigFromEnv() {
	if i.ForceLoad {
		logger.L().Warn("警告：配置已加载过了，不可重复加载！")
		return
	}
	opts := env.Options{
		Prefix: i.LoadConfigRequest.ConfigEnv.Prefix,
	}
	for _, v := range i.confObjs {
		if err := env.ParseWithOptions(v, opts); err != nil {
			panic(fmt.Errorf("读取环境变量失败：%s", err))
		}
	}
}
